跳到主要内容

Server-Sent Events(SSE)

内容主要参考自:SSE协议深度解析:被低估的HTTP服务器推送标准 - 若-飞 - 博客园

  • 官方定位:W3C正式推荐标准(2015年2月发布),非HTTP hack用法,浏览器通过原生EventSource接口支持
  • 协议栈:基于HTTP构建,传输层依赖HTTP/1.1或HTTP/2(Keep-Alive连接),底层为TCP/IP协议
  • 核心作用:实现服务器向客户端的单向实时数据推送,适用于实时通知(用户登录提醒)、数据流推送(传感器数据)、实时监控面板、新闻更新等单向推送场景

HTTP、WebSocket与SSE对比表

对比维度HTTPWebSocketSSE
对比维度HTTPWebSocketSSE
协议基础HTTP/1.1/2/3独立WebSocket协议(RFC 6455)基于HTTP,属HTTP应用层扩展
通信方向客户端→服务器(请求-响应),单向全双工,双向通信半双工,仅服务器→客户端单向推送
连接特性短连接(默认),可通过Keep-Alive实现长连接持久化长连接,需特殊握手基于HTTP Keep-Alive的持久化长连接
浏览器支持所有浏览器原生支持现代浏览器原生支持现代浏览器原生支持(EventSource接口)
自动重连无,需手动实现无,需手动实现内置自动重连,支持重试间隔配置
消息格式任意格式(需指定Content-Type)文本、二进制(Blob/ArrayBuffer)仅UTF-8文本,遵循SSE字段格式
头部开销每个请求/响应均带完整HTTP头,开销大仅握手阶段有HTTP头开销,后续无额外头连接建立有HTTP头开销,后续消息无额外头
适用场景常规请求-响应(页面加载、接口调用)双向实时通信(聊天、游戏、视频会议)单向实时推送(通知、监控数据、新闻更新)
运维成本低,兼容现有HTTP基础设施高,需额外处理协议、端口、负载均衡低,复用HTTP基础设施,防火墙友好

SSE协议的三要素

sse连接过程图.webp

1. 必备响应头:text/event-stream

http

HTTP/1.1 200 OK
Content-Type: text/event-stream # 核心标识
Cache-Control: no-cache # 禁止缓存
Connection: keep-alive # 保持连接
Transfer-Encoding: chunked # 分块传输(可选)

关键点text/event-stream是IANA注册的标准MIME类型(RFC 2046),不是随意字符串。

2. 数据格式规范:严格的文本协议

// 一个完整的SSE消息单元
data: 这是消息内容\n // 数据行(可多行)
data: 继续上一消息的第二行\n
id: 42\n // 消息ID(用于重连)
event: message\n // 事件类型
retry: 10000\n // 重连间隔(毫秒)
\n // 空行表示消息结束

// 浏览器接收到的对象:
{
data: "这是消息内容\n继续上一消息的第二行",
lastEventId: "42",
type: "message"
}

3. 连接管理:HTTP Keep-Alive的创造性应用

基于HTTP Keep-Alive实现长连接,服务器持续推送数据,连接随客户端断开或服务器终止而结束;服务器需通过Flusher强制立即发送数据。

协议工作原理:一次握手,无限推送

建立连接流程

客户端->服务器: GET /stream HTTP/1.1
客户端->服务器: Accept: text/event-stream
服务器->客户端: HTTP/1.1 200 OK
服务器->客户端: Content-Type: text/event-stream
服务器->客户端: Connection: keep-alive
服务器->客户端:
服务器->客户端: data: 欢迎连接\n\n
服务器->客户端: data: 实时数据...\n\n
服务器->客户端: data: 持续推送...\n\n
Note right of 客户端: 连接保持打开
Note left of 服务器: 可随时推送新消息

消息流示例

客户端请求:
GET /api/events HTTP/1.1
Host: example.com
Accept: text/event-stream

服务器响应流:
HTTP/1.1 200 OK
Content-Type: text/event-stream
Connection: keep-alive

: 心跳保持连接
data: 用户alice登录
event: user-login
id: 101

data: {"temperature": 23.5}
event: sensor-data
id: 102

data: 系统即将维护
event: system-alert
id: 103
retry: 30000

... 持续不断 ...

重要特性与机制

  • 自动重连:浏览器内置机制,断线后按retry间隔重试(默认3秒),重连自动携带Last-Event-ID

  • 事件ID追踪:通过id字段记录消息序列,重连时服务器可补发遗漏消息

  • 多事件类型:支持自定义event字段,客户端可针对性监听

  • HTTP/2适配:HTTP2支持多路复用,一个TCP连接可并行多个SSE流,规避HTTP/1.1并发连接限制(每个域名最多6个并发HTTP/1.1连接)